package per.wxp.redis.service;

import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import per.wxp.redis.entity.User;
import per.wxp.redis.mapper.UserMapper;

import javax.annotation.Resource;


@Service
@CacheConfig(cacheNames = "users")
public class UserService {
    @Resource
    private UserMapper mapper;

    //   @Cacheable  spring 会在其被调用后将返回值缓存起来，以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果，而不需要再次执行该方法。
    @Cacheable(key ="T(String).valueOf(#userId)")
    public User selectByPrimaryKey(Integer userId){
        return mapper.selectByPrimaryKey( userId);
    }

    //   @CachePut  标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果，而是每次都会执行该方法，并将执行结果以键值对的形式存入指定的缓存中。
    @CachePut(value="users",key ="T(String).valueOf(#record.userId)")
    public int insert(User record){
        return mapper.insert(record);
    }

    @CachePut(key ="T(String).valueOf(#record.userId)",condition = "#record.id != null ")
    public User updateByPrimaryKey(User record){
        mapper.updateByPrimaryKey(record);
        System.out.println(record.toString());
        return record;
    }

    //   @CacheEvict 用来标注在需要清除缓存元素的方法或类上的。
    @CacheEvict(key ="T(String).valueOf(#userId)")
    public  int deleteByPrimaryKey(Integer userId){
        return mapper.deleteByPrimaryKey(userId);
    }

}
